<pre>
CORE PYTHON APPLICATIONS PROGRAMMING
    3rd Edition, by Wesley J. Chun
    ISBN-13: 978-0-13-267820-9
    ISBN-10: 0-13-267820-9

UPDATE: some code updated in 2015; license changed from CC3 to Apache2

These directories contain all of the source code for the
applications in the book.

Also be sure to check out the COLOPHON.txt, COPYRIGHT.txt,
and LICENSE.txt files.  The "ls-lFR.txt" file contains a
fully-recursive directory listing.  The "all.zip" and
"all.tgz" files represent snapshots of everything here.

All source code under Apache 2.0 license
# http://www.apache.org/licenses/LICENSE-2.0.html

Note that all the files have CR-LF line terminators so they're
readable on PCs running Windows. If you're running POSIX (Linux,
Mac OS X, etc.) run dos2unix or use your favorite editor to
strip the CRs.

$ ls -lFR
.:
total 300
-rw-r--r-- 1 wesc wesc  64987 Jul 19  2012 all.tgz
-rw-r--r-- 1 wesc wesc 141550 Jul 19  2012 all.zip
drwxr-xr-x 2 wesc wesc   4096 Mar  1  2012 ch01/
drwxr-xr-x 2 wesc wesc   4096 Feb 25  2012 ch02/
drwxr-xr-x 2 wesc wesc   4096 Feb 27  2012 ch03/
drwxr-xr-x 2 wesc wesc   4096 Feb 27  2012 ch04/
drwxr-xr-x 2 wesc wesc   4096 Feb 28  2012 ch05/
drwxr-xr-x 2 wesc wesc   4096 Feb 27  2012 ch06/
drwxr-xr-x 2 wesc wesc   4096 Feb 28  2012 ch07/
drwxr-xr-x 3 wesc wesc   4096 Feb 27  2012 ch08/
drwxr-xr-x 2 wesc wesc   4096 Feb 27  2012 ch09/
drwxr-xr-x 2 wesc wesc   4096 Feb 29  2012 ch10/
drwxr-xr-x 4 wesc wesc   4096 Mar  2  2012 ch11/
drwxr-xr-x 2 wesc wesc   4096 Mar 23  2012 ch12/
drwxr-xr-x 2 wesc wesc   4096 Sep  2  2015 ch13/
drwxr-xr-x 2 wesc wesc   4096 Sep  2  2015 ch14/
drwxr-xr-x 2 wesc wesc   4096 Aug 16  2012 ch15/
-rw-r--r-- 1 wesc wesc   1791 Mar  8  2012 COLOPHON.txt
-rw-r--r-- 1 wesc wesc    320 Mar  8  2012 COPYRIGHT.txt
-rw-r--r-- 1 wesc wesc    824 Mar  8  2012 LICENSE.txt
-rw-r--r-- 1 wesc wesc      0 Jul 28 09:01 ls-lFR.txt
-rw-r--r-- 1 wesc wesc  12995 Jul 19  2012 README.html

./ch01:
total 40
-rwxr-xr-x 1 wesc wesc 643 Feb 25  2012 gendata3.py*
-rwxr-xr-x 1 wesc wesc 591 Feb 25  2012 gendata-64b.py*
-rwxr-xr-x 1 wesc wesc 620 Feb 25  2012 gendata.py*
-rwxr-xr-x 1 wesc wesc 745 Feb 25  2012 gendataU.py*
-rw-r--r-- 1 wesc wesc 347 Feb 25  2012 README.html
-rwxr-xr-x 1 wesc wesc 236 Feb 24  2012 retasklist.py*
-rwxr-xr-x 1 wesc wesc 209 Feb 25  2012 rewho3-hacker.py*
-rwxr-xr-x 1 wesc wesc 162 Feb 24  2012 rewho3.py*
-rwxr-xr-x 1 wesc wesc 157 Feb 24  2012 rewho.py*
-rwxr-xr-x 1 wesc wesc 205 Feb 24  2012 rewhoU.py*

./ch02:
total 60
-rw-r--r-- 1 wesc wesc 452 Feb 25  2012 README.html
-rwxr-xr-x 1 wesc wesc 429 Sep 11  2010 tsTclnt3.py*
-rwxr-xr-x 1 wesc wesc 424 Sep 11  2010 tsTclnt3V6.py*
-rwxr-xr-x 1 wesc wesc 400 Sep 11  2010 tsTclnt.py*
-rwxr-xr-x 1 wesc wesc 413 Sep 11  2010 tsTclntSS.py*
-rwxr-xr-x 1 wesc wesc 724 Sep 11  2010 tsTclntTW.py*
-rwxr-xr-x 1 wesc wesc 395 Sep 11  2010 tsTclntV6.py*
-rwxr-xr-x 1 wesc wesc 665 Sep 11  2010 tsTserv3.py*
-rwxr-xr-x 1 wesc wesc 666 Sep 11  2010 tsTserv3V6.py*
-rwxr-xr-x 1 wesc wesc 560 Mar 19  2009 tsTserv.py*
-rwxr-xr-x 1 wesc wesc 492 Mar 19  2009 tsTservSS.py*
-rwxr-xr-x 1 wesc wesc 535 Sep 11  2010 tsTservTW.py*
-rwxr-xr-x 1 wesc wesc 561 Sep 11  2010 tsTservV6.py*
-rwxr-xr-x 1 wesc wesc 391 Sep 11  2010 tsUclnt.py*
-rwxr-xr-x 1 wesc wesc 431 Mar 19  2009 tsUserv.py*

./ch03:
total 36
-rwxr-xr-x 1 wesc wesc 1342 Feb 25  2012 email-examples.py*
-rwxr-xr-x 1 wesc wesc 2390 Feb 27  2012 getFirstNNTP3.py*
-rwxr-xr-x 1 wesc wesc 2367 Sep 12  2010 getFirstNNTP.py*
-rwxr-xr-x 1 wesc wesc 1129 Feb 27  2012 getLatestFTP3.py*
-rwxr-xr-x 1 wesc wesc 1119 Feb 27  2012 getLatestFTP.py*
-rwxr-xr-x 1 wesc wesc 2217 Feb 25  2012 gmail.py*
-rwxr-xr-x 1 wesc wesc  728 Feb 25  2012 myMail.py*
-rw-r--r-- 1 wesc wesc  430 Feb 25  2012 README.html
-rwxr-xr-x 1 wesc wesc 2290 Feb 25  2012 ymail.py*

./ch04:
total 104
-rwxr-xr-x 1 wesc wesc  861 Feb 27  2012 bookrank3CF.py*
-rwxr-xr-x 1 wesc wesc  977 Feb 27  2012 bookrank3.py*
-rwxr-xr-x 1 wesc wesc  951 Feb 27  2012 bookrank.py*
-rwxr-xr-x 1 wesc wesc 1252 Apr  5  2011 candy3.py*
-rwxr-xr-x 1 wesc wesc 1229 Apr  5  2011 candy.py*
-rwxr-xr-x 1 wesc wesc 1016 Sep 12  2010 mtfacfib3.py*
-rwxr-xr-x 1 wesc wesc  994 Nov 16  2011 mtfacfib.py*
-rwxr-xr-x 1 wesc wesc  515 Feb 27  2012 mtsleepA3.py*
-rwxr-xr-x 1 wesc wesc  506 Sep 20  2006 mtsleepA.py*
-rwxr-xr-x 1 wesc wesc  732 Feb 27  2012 mtsleepB3.py*
-rwxr-xr-x 1 wesc wesc  719 Sep 12  2010 mtsleepB.py*
-rwxr-xr-x 1 wesc wesc  726 Feb 27  2012 mtsleepC3.py*
-rwxr-xr-x 1 wesc wesc  716 Sep 12  2010 mtsleepC.py*
-rwxr-xr-x 1 wesc wesc  978 Feb 27  2012 mtsleepD3.py*
-rwxr-xr-x 1 wesc wesc  968 Sep 12  2010 mtsleepD.py*
-rwxr-xr-x 1 wesc wesc  897 Feb 27  2012 mtsleepE3.py*
-rwxr-xr-x 1 wesc wesc  872 Mar 27  2011 mtsleepE.py*
-rwxr-xr-x 1 wesc wesc 1121 Apr  4  2011 mtsleepF3.py*
-rwxr-xr-x 1 wesc wesc 1118 Apr  4  2011 mtsleepF.py*
-rwxr-xr-x 1 wesc wesc  589 Sep 12  2010 myThread3.py*
-rwxr-xr-x 1 wesc wesc  587 Sep 12  2010 myThread.py*
-rwxr-xr-x 1 wesc wesc  423 Sep 12  2010 onethr3.py*
-rwxr-xr-x 1 wesc wesc  423 Sep 20  2006 onethr.py*
-rwxr-xr-x 1 wesc wesc 1039 Sep 11  2010 prodcons3.py*
-rwxr-xr-x 1 wesc wesc 1027 Sep 11  2010 prodcons.py*
-rw-r--r-- 1 wesc wesc  673 Feb 25  2012 README.html

./ch05:
total 84
-rwxr-xr-x 1 wesc wesc 1575 Feb 27  2012 animalGtk.pyw*
-rwxr-xr-x 1 wesc wesc  675 Feb 27  2012 animalPmw3.pyw*
-rwxr-xr-x 1 wesc wesc  675 Feb 27  2012 animalPmw.pyw*
-rwxr-xr-x 1 wesc wesc  641 Feb 27  2012 animalTix3.pyw*
-rwxr-xr-x 1 wesc wesc  633 Feb 27  2012 animalTix.pyw*
-rwxr-xr-x 1 wesc wesc  606 Apr 12  2011 animalTtk3.pyw*
-rwxr-xr-x 1 wesc wesc  597 Apr 12  2011 animalTtk.pyw*
-rwxr-xr-x 1 wesc wesc 1388 Feb 27  2012 animalWx.pyw*
-rwxr-xr-x 1 wesc wesc 3454 Feb 27  2012 listdir3.py*
-rwxr-xr-x 1 wesc wesc 3454 Feb 27  2012 listdir.py*
-rwxr-xr-x 1 wesc wesc 1169 Feb 27  2012 pfaGUI3.py*
-rwxr-xr-x 1 wesc wesc 1163 Feb 27  2012 pfaGUI.py*
-rw-r--r-- 1 wesc wesc  886 Feb 27  2012 README.html
-rwxr-xr-x 1 wesc wesc  146 Feb 27  2012 tkhelloA3.py*
-rwxr-xr-x 1 wesc wesc  146 Sep 21  2000 tkhelloA.py*
-rwxr-xr-x 1 wesc wesc  168 Feb 27  2012 tkhelloB3.py*
-rwxr-xr-x 1 wesc wesc  168 Sep 21  2000 tkhelloB.py*
-rwxr-xr-x 1 wesc wesc  273 Feb 27  2012 tkhelloC3.py*
-rwxr-xr-x 1 wesc wesc  273 Sep 20  2006 tkhelloC.py*
-rwxr-xr-x 1 wesc wesc  550 Feb 27  2012 tkhelloD3.py*
-rwxr-xr-x 1 wesc wesc  550 Sep 21  2000 tkhelloD.py*

./ch06:
total 32
-rw-r--r-- 1 wesc wesc  337 Feb 27  2012 README.html
-rwxr-xr-x 1 wesc wesc 4680 Sep 10  2011 ushuffle_db.py*
-rwxr-xr-x 1 wesc wesc 5389 Feb 27  2012 ushuffle_dbU.py*
-rwxr-xr-x 1 wesc wesc 2169 Sep 10  2011 ushuffle_mongo.py*
-rwxr-xr-x 1 wesc wesc 3474 Feb 12  2012 ushuffle_sad.py*
-rwxr-xr-x 1 wesc wesc 2832 Sep 10  2011 ushuffle_so.py*

./ch07:
total 52
-rwxr-xr-x 1 wesc wesc 1424 Feb 27  2012 estock3.pyw*
-rwxr-xr-x 1 wesc wesc 1404 Feb 27  2012 estock.pyw*
-rwxr-xr-x 1 wesc wesc  754 Feb 27  2012 excel3.pyw*
-rwxr-xr-x 1 wesc wesc  741 Feb 27  2012 excel.pyw*
-rwxr-xr-x 1 wesc wesc  908 Feb 27  2012 olook3.pyw*
-rwxr-xr-x 1 wesc wesc  896 Feb 27  2012 olook.pyw*
-rwxr-xr-x 1 wesc wesc 1141 Feb 27  2012 outlook_edit.pyw*
-rwxr-xr-x 1 wesc wesc  874 Feb 27  2012 ppoint3.pyw*
-rwxr-xr-x 1 wesc wesc  862 Feb 27  2012 ppoint.pyw*
-rw-r--r-- 1 wesc wesc  437 Feb 27  2012 README.html
-rwxr-xr-x 1 wesc wesc 3098 Apr 20  2011 txt2ppt.pyw*
-rwxr-xr-x 1 wesc wesc  764 Feb 27  2012 word3.pyw*
-rwxr-xr-x 1 wesc wesc  752 Feb 27  2012 word.pyw*

./ch08:
total 16
-rw-r--r-- 1 wesc wesc  891 Sep 20  2006 Extest1.c
-rw-r--r-- 1 wesc wesc 1713 Sep 20  2006 Extest2.c
-rw-r--r-- 1 wesc wesc  272 Feb 27  2012 README.html
-rwxr-xr-x 1 wesc wesc  164 Apr 30  2006 setup.py*

./ch09:
total 40
-rwxr-xr-x 1 wesc wesc 4180 Feb 27  2012 crawl3.py*
-rwxr-xr-x 1 wesc wesc 3986 Feb 27  2012 crawl.py*
-rwxr-xr-x 1 wesc wesc 2366 Feb 27  2012 mech.py*
-rwxr-xr-x 1 wesc wesc  851 Feb 27  2012 myhttpd3.py*
-rwxr-xr-x 1 wesc wesc  851 May 22  2011 myhttpd.py*
-rwxr-xr-x 1 wesc wesc 2016 Feb 27  2012 parse_links.py*
-rw-r--r-- 1 wesc wesc  372 Feb 27  2012 README.html
-rwxr-xr-x 1 wesc wesc  940 Feb 27  2012 urlopen_auth3.py*
-rwxr-xr-x 1 wesc wesc  853 Feb 27  2012 urlopen_auth.py*

./ch10:
total 52
-rwxr-xr-x 1 wesc wesc 6218 Feb 27  2012 advcgi3.py*
-rwxr-xr-x 1 wesc wesc 6070 Aug 31  2011 advcgi.py*
-rwxr-xr-x 1 wesc wesc  400 Feb 27  2012 friendsA3.py*
-rwxr-xr-x 1 wesc wesc  399 Dec 30  2000 friendsA.py*
-rwxr-xr-x 1 wesc wesc 1449 Feb 27  2012 friendsB3.py*
-rwxr-xr-x 1 wesc wesc 1446 Aug 28  2011 friendsB.py*
-rwxr-xr-x 1 wesc wesc 2295 Feb 27  2012 friendsC3.py*
-rwxr-xr-x 1 wesc wesc 2283 Aug 28  2011 friendsC.py*
-rw-r--r-- 1 wesc wesc  570 Aug 26  2011 friends.htm
-rw-r--r-- 1 wesc wesc  361 Feb 27  2012 README.html
-rwxr-xr-x 1 wesc wesc  392 Feb 27  2012 uniCGI.py*

./ch11:
total 12
drwxr-xr-x 5 wesc wesc 4096 Mar  2  2012 myproject/
drwxr-xr-x 3 wesc wesc 4096 Mar  2  2012 mysite/
-rw-r--r-- 1 wesc wesc 1157 Mar  2  2012 README.html

./ch11/myproject:
total 28
drwxr-xr-x 2 wesc wesc 4096 Mar  1  2012 approver/
-rw-r--r-- 1 wesc wesc    0 Jan 11  2011 __init__.py
-rw-r--r-- 1 wesc wesc  503 Mar  2  2012 manage.py
drwxr-xr-x 2 wesc wesc 4096 Apr  4  2012 poster/
-rw-r--r-- 1 wesc wesc 5311 Mar  2  2012 settings.py
drwxr-xr-x 2 wesc wesc 4096 Jan  5  2012 templates/
-rw-r--r-- 1 wesc wesc  596 Mar  1  2012 urls.py

./ch11/myproject/approver:
total 16
-rw-r--r-- 1 wesc wesc    0 Jan 11  2011 __init__.py
-rw-r--r-- 1 wesc wesc   57 Jan 11  2011 models.py
-rw-r--r-- 1 wesc wesc  514 Jan 11  2011 tests.py
-rw-r--r-- 1 wesc wesc  174 Jan 12  2011 urls.py
-rw-r--r-- 1 wesc wesc 3810 Jan 30  2012 views.py

./ch11/myproject/poster:
total 20
-rw-r--r-- 1 wesc wesc   91 Mar 27  2012 admin.py
-rw-r--r-- 1 wesc wesc    0 Dec  4  2010 __init__.py
-rw-r--r-- 1 wesc wesc  878 Jan 30  2012 models.py
-rw-r--r-- 1 wesc wesc  514 Dec  4  2010 tests.py
-rw-r--r-- 1 wesc wesc  200 Dec 23  2010 urls.py
-rw-r--r-- 1 wesc wesc 1666 Apr  4  2012 views.py

./ch11/myproject/templates:
total 20
-rw-r--r-- 1 wesc wesc 1227 Dec  6  2010 list_tweets.html
-rw-r--r-- 1 wesc wesc  531 Dec 20  2010 login.html
-rw-r--r-- 1 wesc wesc  237 Dec  5  2010 post_tweet.html
-rw-r--r-- 1 wesc wesc  920 Dec  6  2010 review_tweet.html
-rw-r--r-- 1 wesc wesc  376 Dec  4  2010 thank_you.html

./ch11/mysite:
total 20
drwxr-xr-x 3 wesc wesc 4096 Mar  1  2012 blog/
-rw-r--r-- 1 wesc wesc    0 Dec  8  2010 __init__.py
-rw-r--r-- 1 wesc wesc  517 Mar  2  2012 manage.py
-rw-r--r-- 1 wesc wesc 5039 Mar  2  2012 settings.py
-rw-r--r-- 1 wesc wesc  466 Dec 17  2010 urls.py

./ch11/mysite/blog:
total 24
-rw-r--r-- 1 wesc wesc  192 Dec 16  2010 admin.py
-rw-r--r-- 1 wesc wesc    0 Dec  9  2010 __init__.py
-rw-r--r-- 1 wesc wesc  374 Mar  1  2012 models.py
drwxr-xr-x 2 wesc wesc 4096 Mar  1  2012 templates/
-rw-r--r-- 1 wesc wesc 1205 Jan 30  2012 tests.py
-rw-r--r-- 1 wesc wesc  158 Mar  1  2012 urls.py
-rw-r--r-- 1 wesc wesc  647 Jan 12  2011 views.py

./ch11/mysite/blog/templates:
total 4
-rw-r--r-- 1 wesc wesc 696 Dec 19  2010 archive.html

./ch12:
total 28
-rw-r--r-- 1 wesc wesc 174 Feb 29  2012 app.yaml-default
-rw-r--r-- 1 wesc wesc 195 Feb 29  2012 app.yaml-py27
-rw-r--r-- 1 wesc wesc 361 Feb 29  2012 main.py-clean
-rw-r--r-- 1 wesc wesc 398 Feb 29  2012 main.py-default
-rw-r--r-- 1 wesc wesc 192 Mar 23  2012 main.py-py27
-rw-r--r-- 1 wesc wesc 374 Dec 13  2011 main.py-py27-users
-rw-r--r-- 1 wesc wesc 483 Feb 29  2012 README.html

./ch13:
total 52
-rw-r--r-- 1 wesc wesc  606 Jul 28 08:57 README.html
-rw-r--r-- 1 wesc wesc 1873 Aug 30  2015 settings_TMPL.py
-rwxr-xr-x 1 wesc wesc  520 Feb 28  2012 stock3.py*
-rwxr-xr-x 1 wesc wesc  485 Feb 28  2012 stock-orig.py*
-rwxr-xr-x 1 wesc wesc  666 Aug 30  2015 stock.py*
-rwxr-xr-x 1 wesc wesc 5970 Feb 28  2012 twapi-orig.py*
-rwxr-xr-x 1 wesc wesc 5458 Aug 30  2015 twapi.py*
-rw-r--r-- 1 wesc wesc  591 Aug 16  2012 twe_a.py
-rw-r--r-- 1 wesc wesc  423 Aug 16  2012 twe_u.py
-rw-r--r-- 1 wesc wesc  765 Aug 16  2012 twy_a.py
-rw-r--r-- 1 wesc wesc  570 Aug 16  2012 twy_u.py

./ch14:
total 40
-rwxr-xr-x 1 wesc wesc  633 Feb 27  2012 csvex-orig.py*
-rwxr-xr-x 1 wesc wesc  657 Sep  2  2015 csvex.py*
-rwxr-xr-x 1 wesc wesc  755 Feb 27  2012 dict2json-orig.py*
-rwxr-xr-x 1 wesc wesc  618 Sep  2  2015 dict2json.py*
-rwxr-xr-x 1 wesc wesc 1176 Feb 27  2012 dict2xml-orig.py*
-rwxr-xr-x 1 wesc wesc 1211 Sep  2  2015 dict2xml.py*
-rwxr-xr-x 1 wesc wesc 1367 Feb 27  2012 goognewsrss.py*
-rw-r--r-- 1 wesc wesc  591 Jul 28 08:58 README.html
-rwxr-xr-x 1 wesc wesc  762 Feb 27  2012 xmlrpcclnt.py*
-rwxr-xr-x 1 wesc wesc 1585 Feb 27  2012 xmlrpcsrvr.py*

./ch15:
total 36
-rwxr-xr-x 1 wesc wesc 1082 Aug 16  2012 plus_a.py*
-rwxr-xr-x 1 wesc wesc  514 Apr  6  2012 plus.py*
-rwxr-xr-x 1 wesc wesc 4126 Feb 28  2012 plus_top_posts.py*
-rwxr-xr-x 1 wesc wesc  644 Aug 16  2012 plus_u.py*
-rw-r--r-- 1 wesc wesc  334 Jul 19  2012 README.html
-rwxr-xr-x 1 wesc wesc 1545 Aug 16  2012 settings_TMPL.py*
-rw-r--r-- 1 wesc wesc 1095 Sep 20  2006 swhello.java
-rwxr-xr-x 1 wesc wesc  477 Sep 20  2006 swhello.py*
